page.tsx 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398
  1. "use client";
  2. import {
  3. getCommissionApi,
  4. getRegisterCountApi,
  5. getTotalCountApi,
  6. getWithdrawalApi,
  7. } from "@/api/summary";
  8. import { useUserInfoStore } from "@/stores/useUserInfoStore";
  9. import { useRequest } from "ahooks";
  10. import { Toast } from "antd-mobile";
  11. import { useLocale, useTranslations } from "next-intl";
  12. import { getToken } from "@/utils/Cookies";
  13. import { copyText } from "@/utils/methods";
  14. import { FC, useRef, useState } from "react";
  15. import "./page.scss";
  16. interface Props {}
  17. const App: FC<Props> = (props) => {
  18. const t = useTranslations("SummaryPage");
  19. const locale = useLocale();
  20. const sliderRef = useRef<HTMLDivElement>(null);
  21. const [num, setNum] = useState(100);
  22. const [money, setMoney] = useState("5000");
  23. const { userInfo } = useUserInfoStore();
  24. const token = getToken();
  25. // 生成分享链接
  26. const BASE_URL = process.env.NEXT_PUBLIC_SHARE_URL;
  27. const shareUrl = `${BASE_URL}/${locale}/${userInfo ? userInfo.referrer_code : "xxxxxx"}`;
  28. // 轮询时间
  29. const TIME = 180000;
  30. const getUserMoneyHandler = () => {
  31. if (token) {
  32. return getRegisterCountApi().then((res) => {
  33. if (res.code === 200) return res.data;
  34. });
  35. }
  36. return Promise.resolve({
  37. commissar: 0,
  38. effective_amount: 0,
  39. recharge_user_count: 0,
  40. reg_count: 0,
  41. });
  42. };
  43. const { data: todayData } = useRequest(getUserMoneyHandler, {
  44. pollingInterval: TIME,
  45. pollingWhenHidden: true,
  46. pollingErrorRetryCount: 3,
  47. staleTime: 5000,
  48. refreshDeps: [token],
  49. });
  50. const getTotalCount = () => {
  51. if (token) {
  52. return getTotalCountApi().then((res) => {
  53. if (res.code === 200) return res.data;
  54. });
  55. }
  56. return Promise.resolve({
  57. commissar: 0,
  58. effective_amount: 0,
  59. recharge_user_count: 0,
  60. reg_count: 0,
  61. });
  62. };
  63. const { data: totalData } = useRequest(getTotalCount, {
  64. pollingInterval: TIME,
  65. pollingWhenHidden: true,
  66. pollingErrorRetryCount: 3,
  67. staleTime: 5000,
  68. refreshDeps: [token],
  69. });
  70. const getCommission = () => {
  71. if (token) {
  72. return getCommissionApi().then((res) => {
  73. if (res.code === 200) return res.data;
  74. });
  75. }
  76. return Promise.resolve({
  77. commissar: 0,
  78. level: 0,
  79. withdrawal_commissions: 0,
  80. enable_receive: false,
  81. min_value: 0,
  82. max_value: 0,
  83. });
  84. };
  85. const { data: commissionData, run: commissionRun } = useRequest(getCommission, {
  86. pollingInterval: TIME,
  87. pollingWhenHidden: true,
  88. pollingErrorRetryCount: 3,
  89. staleTime: 5000,
  90. refreshDeps: [token],
  91. });
  92. const handleSlide: any = (e: React.MouseEvent<HTMLDivElement, MouseEvent>) => {
  93. if (sliderRef.current) {
  94. const startX = sliderRef.current.getBoundingClientRect().x;
  95. const x = e.clientX - startX;
  96. const xRem = x / (144 * 0.6);
  97. const intNum = Math.round(10000 * xRem) - Math.round((10000 * xRem) % 10);
  98. setNum(intNum);
  99. const m = intNum * 50;
  100. let r = "";
  101. const arr = m.toString().split("");
  102. arr.forEach((item, i) => {
  103. if (i !== arr.length - 1 && (arr.length - i - 1) % 3 === 0) {
  104. r += item + ",";
  105. } else {
  106. r += item;
  107. }
  108. });
  109. setMoney(r);
  110. const scale = (Math.round(xRem * 10000) / 100.0).toFixed(2) + "%";
  111. sliderRef.current.style.width = scale;
  112. }
  113. };
  114. const copy = (text: string) => {
  115. copyText(text);
  116. Toast.show({ icon: "success", content: t("copySuc"), maskClickable: false });
  117. };
  118. const withdrawalHandler = async () => {
  119. if (commissionData?.commissar) return;
  120. if (
  121. commissionData?.enable_receive &&
  122. commissionData.commissar! > Math.min(commissionData.min_value, 10)
  123. ) {
  124. const available =
  125. commissionData.max_value > commissionData.commissar!
  126. ? commissionData.max_value
  127. : commissionData.commissar;
  128. await getWithdrawalApi({ amount: available! });
  129. // 间隔时间
  130. setTimeout(() => {
  131. commissionRun();
  132. }, 100);
  133. } else {
  134. Toast.show(t("receive"));
  135. }
  136. };
  137. return (
  138. <div className="content">
  139. <div className="summary referral-router-view">
  140. <div className="content" style={{ marginTop: 0 }}>
  141. <div className="title">
  142. <div>
  143. {t("Hoje")}
  144. <span className="iconfont icon-bangzhu" />
  145. </div>
  146. </div>
  147. <div className="cardMian">
  148. <ul className="statistics-card">
  149. <li>
  150. <p className="num">{todayData?.reg_count}</p>
  151. <p> {t("Inscrições")} </p>
  152. </li>
  153. <li>
  154. <p className="num">{todayData?.recharge_user_count}</p>
  155. <p> {t("Novos")} </p>
  156. </li>
  157. <li>
  158. <p className="num">
  159. <span className={"mr-[5px]"}>{t("R$")}</span>
  160. {todayData?.effective_amount}
  161. </p>
  162. <p> {t("Aposta")} </p>
  163. </li>
  164. <li>
  165. <p className="num">
  166. <span className={"mr-[5px]"}>{t("R$")}</span>
  167. {todayData?.commissar}
  168. </p>
  169. <p> {t("Comissão")} </p>
  170. </li>
  171. </ul>
  172. </div>
  173. </div>
  174. <div className="content">
  175. <div className="title">
  176. <div>
  177. {t("Total")}
  178. <span className="iconfont icon-bangzhu" />
  179. </div>
  180. </div>
  181. <div className="cardMian">
  182. <ul className="statistics-card">
  183. <li>
  184. <p className="num">{totalData?.reg_count}</p>
  185. <p> {t("Inscrições")} </p>
  186. </li>
  187. <li>
  188. <p className="num">{totalData?.recharge_user_count}</p>
  189. <p> {t("Jogadores")} </p>
  190. </li>
  191. <li>
  192. <p className="num">
  193. <span className={"mr-[5px]"}>{t("R$")}</span>
  194. {totalData?.effective_amount}
  195. </p>
  196. <p> {t("ApostaTotal")} </p>
  197. </li>
  198. <li>
  199. <p className="num">
  200. <span className={"mr-[5px]"}>{t("R$")}</span>
  201. {totalData?.commissar}
  202. </p>
  203. <p>RS {t("Comissão")} </p>
  204. </li>
  205. </ul>
  206. </div>
  207. </div>
  208. <div className="content">
  209. <div className="title">
  210. <div>
  211. {t("Comissão")}
  212. <span className="iconfont icon-bangzhu" />
  213. </div>
  214. </div>
  215. <div className="cardMian">
  216. <div className="vip">
  217. <div className="level">
  218. <span className="iconfont icon-vip"></span>
  219. <span className="levelNum">{commissionData?.level}</span>
  220. </div>
  221. <div>
  222. {t("Nível")}
  223. <span className="iconfont icon-tishi"></span>
  224. </div>
  225. </div>
  226. <div>
  227. <ul className="commission">
  228. <li>
  229. <p className="num">
  230. <span>{t("R$")}</span>
  231. <span className="cash">
  232. {commissionData?.withdrawal_commissions}
  233. </span>
  234. </p>
  235. <p> {t("TotalPago")} </p>
  236. </li>
  237. <li>
  238. <p className="num">
  239. <span>{t("R$")}</span>
  240. <span className="cash">{commissionData?.commissar}</span>
  241. </p>
  242. <p> {t("Não")} </p>
  243. </li>
  244. </ul>
  245. <div className="wallet">
  246. <div className="btn" onClick={withdrawalHandler}>
  247. {t("TRANSFERIR")}
  248. </div>
  249. <div className="tip">
  250. <span className="iconfont icon-tishi1"></span>
  251. {t("Valor")}
  252. </div>
  253. </div>
  254. </div>
  255. </div>
  256. </div>
  257. <div className="content shareMain">
  258. <div className="title">
  259. <div>{t("title1")}</div>
  260. </div>
  261. <div className="share">
  262. <ul className="sharePlatform">
  263. <li>
  264. <a href="">
  265. <img src="/img/facebook.webp" alt="" />
  266. </a>
  267. <span>{t("Facebook")}</span>
  268. </li>
  269. <li>
  270. <a href="">
  271. <img src="/img/WhatsApp.webp" alt="" />
  272. </a>
  273. <span>{t("WhatsApp")}</span>
  274. </li>
  275. <li>
  276. <a href="">
  277. <img src="/img/Telegram.png" alt="" />
  278. </a>
  279. <span>{t("Telegram")}</span>
  280. </li>
  281. <li>
  282. <a href="">
  283. <img src="/img/Twitter.webp" alt="" />
  284. </a>
  285. <span>{t("Twitter")}</span>
  286. </li>
  287. <li>
  288. <a href="">
  289. <img src="/img/email.webp" alt="" />
  290. </a>
  291. <span>{t("Email")}</span>
  292. </li>
  293. </ul>
  294. </div>
  295. <div className="shareLink">
  296. <div className="">{t("content1")}</div>
  297. <div className="copyUrl">
  298. <span className="url omitWrap">{shareUrl}</span>
  299. <span id="copy" onClick={() => copy(shareUrl)}>
  300. {t("Cópia")}
  301. </span>
  302. </div>
  303. </div>
  304. </div>
  305. <div className="content">
  306. <div className="title">
  307. <div> {t("title2")}</div>
  308. </div>
  309. <div>
  310. <div className="tel-box">
  311. <a href="" className="telicon">
  312. <img src="/img/telegram.webp" alt="" />
  313. </a>
  314. <div className="hintTitle3">{t("content2-1")}</div>
  315. </div>
  316. <div className="hintTitle2">
  317. <i className="iconfont icon-tishi"></i>
  318. {t("content2-2")}
  319. <a
  320. href=""
  321. style={{
  322. borderBottom: "1px solid rgb(109, 155, 195)",
  323. color: "#0000EE",
  324. }}
  325. >
  326. {t("business")}
  327. </a>
  328. </div>
  329. </div>
  330. </div>
  331. <div className="content">
  332. <div className="title">
  333. <div>
  334. {t("title3")}
  335. <span className="iconfont icon-bangzhu"></span>
  336. </div>
  337. </div>
  338. <div className="hint">
  339. <div className="hintTitle">{t("content3")}</div>
  340. <div className="imgContent">
  341. <img src="/img/cash.png" alt="" />
  342. <div>
  343. {t("number")}
  344. {num}
  345. <br />
  346. {t("Comissão")} &gt; {t("R$")} {money} {t("money")}
  347. </div>
  348. <div
  349. className="slider van-slider"
  350. style={{ height: "0.02rem" }}
  351. onClick={handleSlide}
  352. >
  353. <div
  354. className="van-slider__bar"
  355. style={{ width: "0.900901%", background: "rgb(0, 157, 128)" }}
  356. ref={sliderRef}
  357. >
  358. <div role="slider" className="van-slider__button-wrapper">
  359. <div className="img"></div>
  360. </div>
  361. </div>
  362. </div>
  363. </div>
  364. <div className="relationSchema">
  365. <div className="groupTitle">{t("title4")}</div>
  366. <img src="/img/group_br.webp" alt="" className="groupImg" />
  367. <ul className="rules">
  368. <li>
  369. {t("content4-1")}
  370. <span style={{ color: "red" }}>{t("red")}</span>.
  371. </li>
  372. <li>{t("content4-2")}</li>
  373. </ul>
  374. </div>
  375. </div>
  376. </div>
  377. <div className="content"></div>
  378. </div>
  379. </div>
  380. );
  381. };
  382. export default App;